package com.zijidelu.luframework.domain.model.aggregate;

import com.zijidelu.luframework.domain.event.DomainEvent;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 抽象领域事件聚合根。
 *
 * @author ZIJIDELU
 * @datetime 2025/11/14 14:35
 */
public class AbstractDomainEventAggregateRoot {
    /**
     * 领域事件列表（transient 避免序列化问题）
     */
    private final transient List<DomainEvent<? extends Serializable>> domainEvents = new ArrayList<>();

    protected void clearDomainEvents() {
        domainEvents.clear();
    }

    /**
     * 注册领域事件
     *
     * <p>聚合根内部状态变更时调用此方法注册事件</p>
     *
     * <p>使用规范：
     * 1. 在聚合根方法中状态变更后立即调用
     * 2. 每个业务操作最多注册一个事件
     * 3. 事件应包含完整的业务上下文
     * </p>
     *
     * @param event 领域事件
     */
    public void registerEvent(DomainEvent<? extends Serializable> event) {
        Objects.requireNonNull(event, "domainEvent cannot be null");

        domainEvents.add(event);
    }

    /**
     * 获取并清空领域事件
     *
     * <p>应用服务在事务提交后调用此方法获取事件并发布</p>
     *
     * @return 不可修改的事件列表副本
     */
    public List<DomainEvent<? extends Serializable>> getAndClearDomainEvents() {
        List<DomainEvent<? extends Serializable>> events = new ArrayList<>(domainEvents);
        domainEvents.clear();
        return Collections.unmodifiableList(events);
    }

    /**
     * 获取领域事件（不清理）
     *
     * <p>主要用于测试和调试</p>
     */
    public List<DomainEvent<? extends Serializable>> getDomainEvents() {
        return Collections.unmodifiableList(domainEvents);
    }

}
